/**
 * Universidad del Valle de Guatemala
 * Algoritmos y Estructura de Datos
 * Sección 10
 * Carlos Alberto Solórzano Pineda (08832)
 * 06 de septiembre de 2011 
 * @author carlos
 * @version 1.2
 * @param <E>
 * 
 * Interfaz para una lista
 */

public interface List<E>{
	
	/**
	 * 
	 * @return Tamaño de la lista
	 */
	public int size();
	
	/**
	 * 
	 * @return True si está vacía
	 */
	public boolean isEmpty();
	
	/**
	 * Añade un valor en la primera posición de la lista
	 * @param value E
	 */
	public void addFirst(E value);
	
	/**
	 * Añade un valor en la última posición de la lista
	 * @param value E
	 */
	public void addLast(E value);
	
	/**
	 * 
	 * @return El valor del primer dato en la lista
	 */
	public E getFirst();
	
	/**
	 * 
	 * @return El valor del último dato en la lista
	 */
	public E getLast();
	
	/**
	 * Elimina el dato
	 * @return El valor del primer dato en la lista
	 */
	public E removeFirst();
	
	/**
	 * Elimina el dato
	 * @return El valor del último dato en la lista
	 */
	public E removeLast();
	
	/**
	 * Añade un nuevo dato
	 * @param value
	 */
	public void add(E value);
	
	/**
	 * Elimina un dato específico
	 * @param value
	 */
	public void remove(E value);
	
	/**
	 * Elimina el último valor de la lista
	 * @return El último valor de la lista
	 */
	public E remove();
	
	/**
	 * 
	 * @return El último valor de la lista
	 */
	public E get();
	
	/**
	 * 
	 * @param value
	 * @return True si existe el valor en la lista
	 */
	public boolean contains(E value);
	
	/**
	 * 
	 * @param value
	 * @return El índice del valor en la lista
	 */
	public int indexOf(E value);
	
	/**
	 * 
	 * @param value
	 * @return El índice del valor en la lista
	 */
	public int lastIndexOf(E value);
	
	/**
	 * 
	 * @param i
	 * @return El valor de la lista en el índice especificado
	 */
	public E get(int i);
	
	/**
	 * Cambia el valor en la posición indicada por el parámetro o
	 * @param i
	 * @param o
	 * @return Valor en la posición indicada
	 */
	public E set(int i, E o);
	
	
	/**
	 * Almacena el valor o en la posición i de la lista
	 * @param i
	 * @param o
	 */
	public void add(int i, E o);
	
	/**
	 * Elimina el dato
	 * @param i
	 * @return El valor en la posición indicada
	 */
	public E remove(int i);
	
}
